import org.example.UserService;
import org.springframework.beans.factory.BeanFactory;
import org.springframework.beans.factory.xml.XmlBeanFactory;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.core.io.ClassPathResource;

public class App {

    public static void main1(String[] args) {
        System.out.println("test 测试1");
        //从spring中获取并使用bean对象  依赖查找DF
        // 1.得到spring的上下文对象
        //TODO 在获取上下文的时候时候就对对象进行注入
        ApplicationContext context =
                new ClassPathXmlApplicationContext("spring-config.xml");
        // 2.根据bean标签的id获取bean对象 getBean默认返回object对象 [依赖查找]
        //TODO 根据bean标签的id获取对象
        System.out.println("test 测试2");
        UserService userService = (UserService) context.getBean("user");
        // 3.使用bean对象
        userService.say();
    }





    public static void main2(String[] args) {
        // 1.得到spring上下文对象  bean工厂  不推荐使用 推荐下面的main2
        BeanFactory context = new XmlBeanFactory(
                new ClassPathResource("spring-config.xml"));
        // 2.获取bean对象
        UserService userService = (UserService) context.getBean("user");

        // 3.使用bean对象
        userService.say();
    }

    //TODO application和beanfactory的区别
    // 相同点 都是容器管理对象,都可以获取bean对象
    // 区别
    // 功能 : ①applicationContext是beanfactory的子类 , 相比于beanfactory applicationContext拥有更多功能
    //       ②性能/加载bean的机制 :
    //  ---beanfactory 懒加载,按需加载,使用一个bean加载一个bean,只有使用的时候才会记载 (早期的,所以资源珍贵)
    //  ---applicationContext  一次性将所有bean对象全部加载
    //       ③ beanfactory 启动快,内存占用少,后续获取速度慢 applicationcontext 启动慢,内存占用多,但是后续获取速度快



    // getBean的更多用法
    // 用法1 根据id获取bean对象 --- 需要强转
    // 用法2 根据类型获取bean对象 --- 注入多个对象报错  最不建议使用
    // 用法3  根据名称和类型获取对象 --- 不需要强转 推荐

    public static void main3(String[] args) {
        // 1 得到上下文对象
        ApplicationContext context =
                new ClassPathXmlApplicationContext("spring-config.xml");
        // 2 获取bean对象
        UserService userService1 =
                context.getBean(UserService.class);
        UserService userService2 =
                context.getBean(UserService.class);
        // 3 使用bean对象
        userService1.say();
        System.out.println(userService1 == userService2);
    }

    // 按类型取对象 --- 当同一个类型注入到spring多个的情况下,那么使用类型获取bean就会报错
    // 同个类型注入了多个 -- 多个对象 user 和 user2 不知道获取哪一个

    public static void main(String[] args) {
        // 1 得到上下文对象
        ApplicationContext context =
                new ClassPathXmlApplicationContext("spring-config.xml");
        // 2 获取bean对象
        UserService userService1 =
                context.getBean("user",UserService.class);
        // 3 使用bean对象
        userService1.say();

    }


}
